package com.neusoft.ch11.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*
 * 课堂笔记：
 * 文件与文件流：
 * 1、文件File工具类
 *   File进行文件和目录管理的类；
 *   进行文件的创建、判定类型、获取等一系列的操作；
 *   注意字符串文件名中的分隔符的使用； \\ 转义处理     / 不用转义处理
 *   注意：相对路径和绝对路径
 *   掌握文件对象的常用的方法；
 *   
 *   课下练习：
 *      给定义一个目录，打印该目录下的所有的文件信息。（可以使用递归；循环也可以）
 *      提示：如果目录下还有目录，将该目录下的所有文件全部输出；
 * 2、文件流
 *   根据文件流传输编码可以分为：
 *      字节流；
 *          （以二进制的字节数组传输）
 *          类名以stream结尾的都是字节流
 *          顶级父类：InputStream/OutputStream
 *      字符流；
 *          （以char类型的字符传输）
 *          类名以er/or结尾的是字符流；
 *          顶级父类：Reader/Writer
 *   根据文件流的流向分类：
 *      输入流
 *          流向程序（cpu）的数据流；
 *      输出流
 *          流向外设（磁盘）的数据流；
 * 2.1 OutputStreamWriter/reader可以将字节流转换为字符流；                
 *      
 */
public class TestCh11 {

	public static void main(String[] args) {
		test_fileout();
	}

	
	/**
	 * 字节输入流：FileInputStream
	 */
	private static void test_fileout() {
		// 创建一个文件流输出对象
		FileOutputStream fos = null;
		try {
			// 初始化一个文件流输出对象
			fos = new FileOutputStream("D:/temp/jvm2/Hello.java");

			// 要写出到外设的内容
			String strOut = "jkjfsadjfjkla;wjeklfjksd年后发动机后借款方经理开始大家分开了时间埃里克jukjkljlkjkl";
			// 将要输出的内容，转换为字节数组
			byte[] b = strOut.getBytes(); 
			// 调用输出流进行输出
			fos.write(b);
			System.out.println("文件写出成功");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 字节输入流：FileInputStream
	 */
	private static void test_filein() {
		try {
			// 创建一个文件流输入对象
			FileInputStream fis = new FileInputStream("D:/temp/jvm/Hello.java");
			// 创建一个获取输入流的临时变量（容器）
			byte[] b;
			// read返回值，是本次byte数据接收到的数据长度
			int len = -1; // -1文件流结束
			do {
				// 每次清空数组
				b = new byte[1024];
				// 读取输入流到字节数组中
				len = fis.read(b);
				// 进行业务逻辑处理--当前是输出
				String str = new String(b);
				// 输出
				System.out.print(str);

			} while (len != -1);
			// 关闭资源
			fis.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * File工具类
	 */
	private static void test01() {
		// 创建一个file对象
		File file0 = new File("D:\\temp\\jvm");
		File file1 = new File("D:/temp/jvm/Hello.java");
		System.out.println("getAbsolutePath:" + file1.getAbsolutePath());
		System.out.println("getName:" + file1.getName());

		System.out.println("======================");
		if (file0.exists()) {
			// 获取该目录下的所有文件的文件名
			String[] strFiles = file0.list();
			for (String string : strFiles) {
				System.out.println(string);
			}

			// 获取该目录下的所有文件的文件对象
			System.out.println("======================");
			File[] files = file0.listFiles();
			for (File file : files) {
				System.out.println(file.getAbsolutePath());
			}
		}

		// 创建一个不存在的文件或目录
		//File file2 = new File("D:/temp/jvm2/jvm3/jvm4/");
		File file2 = new File("D:/temp/jvm2/jvm3/jvm4/fileeeeee.java");
		// 创建文件
		if (!file2.exists()) {
			if (file2.isDirectory()) {
				// 创建目录
				file2.mkdirs();
				System.out.println("目录创建完成");
			} else {
				try {
					file2.createNewFile();
					System.out.println("文件创建完成");
				} catch (IOException e) {
					// 文件创建异常
					System.out.println("创建文件异常：" + e.getMessage());
				}
			}
		}
	}

}
